/**************************************************************************//**
 * @item     CosyOS-II Kernel
 * @file     sv_int_loc.h
 * @brief    中断本地服务
 * @details  仅在用户中断中调用，并在本地执行。
 * @author   迟凯峰
 * @version  V3.2.0
 * @date     2024.12.13
 ******************************************************************************/

#ifndef __SV_INT_LOC_H
#define __SV_INT_LOC_H

s_bool_t   si_take_binary  (s_binary_tsp hbin);
m_fetion_t si_recv_fetion  (s_tionbox_tsp htbox);
void      *si_recv_mail    (s_mailbox_tsp hmbox);
s_bool_t   si_take_quemut  (s_queue_tsp hque);
void      *si_recv_msg_c51 (s_queue_tsp hque);
void      *si_recv_msg_n51 (s_queue_tsp hque);

/**
 @addtogroup 中断本地服务
 @{
 */

#define sISV_TakeBin(bin)     si_take_binary(&bin)  /*!< 获取二值信号量 */
#define sISV_RecvFetion(tbox) si_recv_fetion(&tbox) /*!< 接收飞信 */
#define sISV_RecvMail(mbox)   si_recv_mail(&mbox)   /*!< 接收邮件 */
#define sISV_GetTime(t)       s_memcpy(t, iWhichGVar_Read ? &s_rtc : &s_rtc_copy, sizeof(s_rtc_ts)) /*!< 获取时间 */

#if SYSCFG_MCUCORE == 8051
#define sISV_RecvMsg(que) (si_take_quemut((s_queue_tsp)&que) ? si_recv_msg_c51((s_queue_tsp)&que) : OS_NULL) /*!< C51 接收消息 */
#else
#define sISV_RecvMsg(que)  si_recv_msg_n51((s_queue_tsp)&que) /*!< 非51 接收消息 */
#endif

/** 查询标志组 */
#define sISV_QueryFlagGroup(group) \
( \
	  sizeof(group) == 1 ? *(s_u8_t  *)&group ? true : false \
	: sizeof(group) == 2 ? *(s_u16_t *)&group ? true : false \
	: sizeof(group) == 4 ? *(s_u32_t *)&group ? true : false \
	: false \
)

/** @} */

#endif
